home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d883.lha / BBBBS / BBBBS59.lha / rexx / bbsREPORT.rexx < prev    next >
OS/2 REXX Batch file  |  1993-06-04  |  10KB  |  368 lines

  1. /*         $VER: bbsREPORT.rexx 5.9 (4.6.93)
  2.  
  3.                - reports user inactivity -
  4.        - any user who hasn't called for 365 days -
  5.    - less than 3 calls with last older than 270 days -
  6.        - only 1 call made more than 180 days ago -
  7.      - CHANGE THESE LIMITS IF YOU DON'T LIKE THEM! -
  8.  
  9.           - also will report filelist problems -
  10.  
  11. copyright 1991-93 Richard Lee Stockton FREELY DISTRIBUTABLE
  12.  
  13. */
  14.  
  15. CALL TIME('R')
  16. HOW_MANY=100    /* how many old files to put on report */
  17. MIN_DAYS=30     /* don't report files younger than this (in days) */
  18.  
  19. least.=999999999999
  20. CALL PRAGMA('P',-2)
  21.  
  22. SIGNAL ON ERROR
  23. SIGNAL ON SYNTAX
  24. SIGNAL ON FAILURE
  25. NUMERIC DIGITS 14
  26.  
  27. ARG name what2do 
  28. temp=STRIP(WORD(what2do,WORDS(what2do)))
  29. IF DATATYPE(temp,'N') THEN SMALLEST=temp
  30. ELSE SMALLEST=0
  31.  
  32. figarg='s:CONFIG.BBS'
  33. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  34. x=OPEN(f,figarg,'R')
  35. IF x=0 THEN
  36.   DO
  37.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  38.     EXIT(20)
  39.   END
  40.  
  41. lynes.=''
  42. DO i=1 TO 8
  43.   lynes.i=READLN(f)
  44. END
  45. CALL CLOSE(f)
  46.  
  47. compos=POS('/*',lynes.1)
  48. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  49.  
  50. bbsname = STRIP(lynes.1)
  51. sysop   = UPPER(WORD(lynes.2,1))
  52. bbspath = WORD(lynes.6,1)
  53. IF ~EXISTS(bbspath) THEN
  54.   DO
  55.     SAY bbspath 'does not exist!'
  56.     EXIT(20)
  57.   END
  58. testchar=RIGHT(bbspath,1)
  59. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  60.  
  61. libpath            = WORD(lynes.8,1)
  62. IF ~EXISTS(libpath) THEN
  63.   DO
  64.     MSG libpath 'does not exist!'
  65.     EXIT(20)
  66.   END
  67. testchar=RIGHT(libpath,1)
  68. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  69.  
  70.  
  71. IF FIND(what2do,'USERS')=0 THEN SIGNAL FILEREPORT
  72.  
  73. inarg=bbspath'EMail/'name'/INACTIVE_USERS'
  74. CALL CLOSE(STDOUT)
  75. CALL OPEN(STDOUT,inarg,'W')
  76. IF x=0 THEN
  77.   DO
  78.     SAY inarg 'would not open for writing!'
  79.     EXIT(20)
  80.   END
  81.  
  82. userlist=SHOWDIR(bbspath'Users','F')
  83. x=FIND(userlist,sysop)
  84. IF x>0 THEN userlist=DELWORD(userlist,x,1)
  85. SAY LEFT('USER_NAME',28)'days last_session calls location'
  86. ndate=DATE('I')
  87. ten=0
  88. thirty=0
  89. ninty=0
  90. sixmo=0
  91. DO i=1 TO WORDS(userlist)
  92.   thisuser=WORD(userlist,i)
  93.   x=OPEN(f,bbspath'Users/'thisuser,'R')
  94.   IF x=0 THEN
  95.     DO
  96.       SAY thisuser 'userfile would not open!'
  97.       ITERATE i
  98.     END
  99.   lynes.=''
  100.   DO j=1 TO 23
  101.     line=READLN(f)
  102.     IF EOF(f) THEN LEAVE j
  103.     lynes.j=line
  104.   END
  105.   CALL CLOSE(f)
  106.   idate=0
  107.   add2list=0
  108.   IF DATATYPE(WORD(lynes.13,1),'N') THEN
  109.     DO
  110.       idate=DATE('I',STRIP(WORD(lynes.13,1)),'S')
  111.       age=ndate-idate
  112.       IF age<11 THEN ten=ten+1
  113.       IF age<31 THEN thirty=thirty+1
  114.       IF age<91 THEN ninty=ninty+1
  115.       IF age<183 THEN sixmo=sixmo+1
  116.       IF FIND(lynes.21,'VIP_USER')>0 THEN NOP
  117.       ELSE IF (idate+365)<ndate THEN add2list=365
  118.       ELSE IF WORD(lynes.19,6)<4 & (idate+270)<ndate THEN add2list=270
  119.       ELSE IF WORD(lynes.19,6)<2 & (idate+180)<ndate THEN add2list=180
  120.       IF add2list>0 THEN
  121.         DO
  122.           line=LEFT(thisuser,28) RIGHT(add2list,3)'  'DATE(,WORD(lynes.13,1),'S')
  123.           line=line'  'WORD(lynes.19,6)'  'lynes.3
  124.           SAY line
  125.         END
  126.     END
  127.   ELSE SAY 'Bad Date!' thisuser lynes.13
  128. END
  129. SAY
  130. SAY RIGHT(WORDS(userlist),5) 'users.'
  131. SAY RIGHT(sixmo,5) 'of these users have called within the last 6 months.'
  132. SAY RIGHT(ninty,5) 'of these users have called within the last 90 days.'
  133. SAY RIGHT(thirty,5) 'of these users have called within the last 30 days.'
  134. SAY RIGHT(ten,5) 'of these users have called within the last 10 days.'
  135. SAY
  136. SAY ' - end of user report - Elapsed:' TIME('E')
  137. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  138.   CALL SETCLIP('BBS_MESSAGE','INACTIVE_USERS report is waiting in Email.')
  139. CALL TIME('R')
  140.  
  141.  
  142.  
  143. FILEREPORT:
  144. IF FIND(what2do,'FILES')=0 THEN EXIT(0)
  145.  
  146. inarg=bbspath'EMail/'name'/FILELISTS_REPORT'
  147. CALL CLOSE(STDOUT)
  148. CALL OPEN(STDOUT,inarg,'W')
  149. IF x=0 THEN
  150.   DO
  151.     SAY inarg 'would not open for writing!'
  152.     EXIT(20)
  153.   END
  154.  
  155. SAY ' - FileReport -' DATE('W')'  'DATE()'  'TIME('C')
  156. SAY LEFT('-',75,'-')
  157.  
  158. dirs.='0000000'
  159. IF readopen(bbspath'Lists/Libraries') THEN
  160.   DO
  161.     DO i=1
  162.       line=READLN(f)
  163.       IF line='END' | EOF(f) THEN LEAVE i
  164.       num=WORD(line,1)
  165.       IF DATATYPE(num,'N') THEN dirs.num=STRIP(WORD(line,2))
  166.     END
  167.     CALL CLOSE(f)
  168.   END
  169.  
  170. problem=0
  171. IF readopen(bbspath'Lists/Files') THEN
  172.   DO
  173.     DO i=1
  174.       line=READLN(f)
  175.       IF EOF(f) THEN BREAK
  176.       listfile=libpath||COMPRESS(WORD(line,2)'/'WORD(line,3),' ')
  177.       IF EXISTS(listfile) THEN ITERATE i
  178.       link=STATEF(bbspath'FileNotes/'COMPRESS(WORD(line,2)'/'WORD(line,3)))
  179.       link=WORD(link,8)
  180.       realfile=listfile
  181.       IF link~='' THEN realfile=link
  182.       IF EXISTS(realfile) THEN ITERATE i
  183.       temp=listfile
  184.       IF temp~=realfile THEN temp=temp '('realfile')'
  185.       SAY temp 'does not exist!'
  186.       problem=1
  187.     END
  188.     CALL CLOSE(f)
  189.   END
  190. IF ~problem THEN SAY 'All files in the master list exist as links or in the libraries.'
  191. ELSE SAY 'The above files in the master list are not available for downloading!'
  192. SAY i-1 'files listed in ''Lists/Files''.'
  193. xlist='.JPG .GIF .LHA .LZH .ARC .ZOO .ZIP .RUN .EXE .PAK .LHW'
  194. xlist=xlist '.WRP .ZOM .DMS .CPT .SEA .SIT .TXT .JPE JPEG'
  195. k=0
  196. kk=0
  197. DO i=1 TO 99
  198.   IF dirs.i='' | dirs.i='0000000' THEN ITERATE i
  199.   realfiles=SHOWDIR(libpath||dirs.i)
  200.   k=k+WORDS(realfiles)
  201.   DO j=1 TO WORDS(realfiles)
  202.     DO
  203.       file=dirs.i'/'STRIP(WORD(realfiles,j))
  204.       IF ~EXISTS(bbspath'FileNotes/'file) THEN
  205.         SAY 'No file description for' file WORD(STATEF(libpath||file),2) 'bytes.'
  206.     END
  207.   END
  208.   notes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  209.   DO j=1 TO WORDS(notes)
  210.     thisnote=bbspath'FileNotes/'dirs.i'/'STRIP(WORD(notes,j))
  211.     x=OPEN(f,thisnote,'R')
  212.     IF x=0 THEN ITERATE j
  213.     line1=READLN(f)
  214.     line2=READLN(f)
  215.     line3=READLN(f)
  216.     CALL CLOSE(f)
  217.     kk=kk+1
  218.     IF ~EXISTS(libpath||dirs.i'/'STRIP(WORD(notes,j))) THEN
  219.       DO
  220.         link=WORD(STATEF(thisnote),8)
  221.         IF link='' THEN ITERATE j
  222.         ELSE
  223.           DO
  224.             IF EXISTS(link) THEN k=k+1
  225.             ELSE ITERATE j
  226.           END
  227.       END
  228.     filenum=WORD(line1,2)
  229.     IF FIND(xlist,UPPER(RIGHT(thisnote,4)))=0 THEN
  230.       SAY 'File #' filenum WORD(notes,j) 'in' dirs.i 'may be unarchived.'
  231.     nname=WORD(line2,2)
  232.     size=WORD(line2,4)
  233.     dlds=WORD(line2,7)
  234.     dirs.i.1=dirs.i.1+1      /*  files this dir */
  235.     dirs.i.2=dirs.i.2+size   /*  bytes this dir */
  236.     dirs.i.3=dirs.i.3+dlds   /* dloads this dir */
  237.     IF size<SMALLEST THEN ITERATE j
  238.     uldate=norm2seq(SUBWORD(line3,4,3))
  239.     IF uldate<19780000 | uldate>99991231 THEN
  240.       DO
  241.         SAY 'Bad Date! 'SUBWORD(line3,4,3) thisnote
  242.         ITERATE j
  243.       END
  244.     IF DATE('I',uldate,'S')>(DATE('I')-MIN_DAYS) THEN ITERATE j
  245.     DO jj=HOW_MANY TO 1 BY -1
  246.       IF dlds>least.jj THEN ITERATE j
  247.       IF dlds=least.jj & uldate>least.jj.0 THEN ITERATE j
  248.       jjj=jj+1
  249.       least.jjj=least.jj
  250.       least.jjj.0=least.jj.0
  251.       least.jjj.1=least.jj.1
  252.       least.jj=dlds
  253.       least.jj.0=uldate
  254.       least.jj.1=RIGHT(size,8) RIGHT(filenum,6) LEFT(dirs.i,16) nname
  255.     END
  256.   END
  257. END
  258.  
  259. SAY kk 'filenotes.'
  260. SAY k 'actual files in libraries.'
  261.  
  262. IF readopen(bbspath'Lists/Files.ALPHA') THEN
  263.   DO
  264.     DO i=1
  265.       line=READLN(f)
  266.       IF EOF(f) THEN BREAK
  267.     END
  268.     CALL CLOSE(f)
  269.   END
  270. SAY i-1 'files listed in ''Lists/Files.ALPHA''.'
  271. SAY
  272. SAY ' - The 'HOW_MANY' least downloaded, oldest files greater -'
  273. SAY ' - than' comma(SMALLEST) 'bytes in the current libraries -'
  274. SAY RIGHT('dls',5) LEFT('Date',11) RIGHT('Bytes',8) 'File #' LEFT('Library',16) 'Filename'
  275. SAY LEFT('-',62,'-')
  276. DO i=1 TO HOW_MANY
  277.   IF least.i>99991231 THEN ITERATE i
  278.   SAY RIGHT(least.i,5) DATE(,least.i.0,'S') least.i.1
  279. END
  280. SAY
  281. SAY ' - LIBRARY STATISTICS -'
  282. SAY RIGHT('Lib#',4) LEFT('Library Name',16) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  283. SAY LEFT('-',72,'-')
  284. tots.=0
  285. DO i=1 TO 99
  286.   IF dirs.i='' | dirs.i=0 THEN ITERATE i
  287.   DO j=1 TO 3
  288.     tots.j=tots.j+dirs.i.j
  289.   END
  290.   temp=dirs.i.1
  291.   IF temp<1 THEN temp=1
  292.   SAY RIGHT(i,4) LEFT(dirs.i,16) RIGHT(comma(dirs.i.1),5) RIGHT(comma(dirs.i.2),14) RIGHT(comma(dirs.i.3),9) RIGHT(comma((.5+dirs.i.2/temp)%1),11) RIGHT(TRUNC(dirs.i.3/temp,2),7)
  293. END
  294. SAY
  295. SAY LEFT('',21) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  296. SAY LEFT('-',72,'-')
  297. temp=tots.1
  298. IF temp<1 THEN temp=1
  299. SAY RIGHT('TOTALS:',21) RIGHT(comma(tots.1),5) RIGHT(comma(tots.2),14) RIGHT(comma(tots.3),9) RIGHT(comma((.5+tots.2/temp)%1),11) RIGHT(TRUNC(tots.3/temp,2),7)
  300. SAY
  301. SAY ' - end of filelist report - Elapsed:' TIME('E')
  302.  
  303. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  304.   CALL SETCLIP('BBS_MESSAGE','FILELISTS_REPORT is waiting in Email.')
  305.  
  306. EXIT(0);
  307.  
  308.  
  309. readopen:
  310. PARSE ARG fname
  311. ok=OPEN(f,fname,'R')
  312. IF ok~=0 THEN RETURN(1)
  313. line=fname 'failed to open for reading!'
  314. SAY line
  315. RETURN(0)
  316.  
  317.  
  318. norm2seq:     /* takes '3 Jan 1990' and turns it into '19900103' */
  319. ARG da' 'mo' 'yr .
  320. da=da/1
  321. mo=STRIP(mo)
  322. yr=yr/1
  323. IF da<10 THEN da='0'da
  324. SELECT
  325.   WHEN mo='JAN' THEN mo='01'
  326.   WHEN mo='FEB' THEN mo='02'
  327.   WHEN mo='MAR' THEN mo='03'
  328.   WHEN mo='APR' THEN mo='04'
  329.   WHEN mo='MAY' THEN mo='05'
  330.   WHEN mo='JUN' THEN mo='06'
  331.   WHEN mo='JUL' THEN mo='07'
  332.   WHEN mo='AUG' THEN mo='08'
  333.   WHEN mo='SEP' THEN mo='09'
  334.   WHEN mo='OCT' THEN mo='10'
  335.   WHEN mo='NOV' THEN mo='11'
  336.   WHEN mo='DEC' THEN mo='12'
  337.   OTHERWISE RETURN(-1);
  338. END
  339. RETURN(yr||mo||da);
  340.  
  341.  
  342. comma:
  343. ARG num .
  344. num=num%1
  345. dgt=LENGTH(num)
  346. numtext=''
  347. IF dgt>3 THEN numtext=','RIGHT(num,3)
  348. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  349. IF dgt>9 THEN
  350.   DO
  351.     numtext=','LEFT(RIGHT(num,9),3)||numtext
  352.     numtext=LEFT(num,dgt-9)||numtext
  353.   END
  354. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  355. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  356. ELSE numtext=num
  357. RETURN(numtext)
  358.  
  359.  
  360. SYNTAX:
  361. FAILURE:
  362. ERROR:
  363. SAY 'Line:' SIGL ERRORTEXT(RC)
  364. SAY
  365. EXIT;
  366.  
  367. /* end of bbsREPORT.rexx */
  368.